class MyPromise {
  constructor(executor) {
    // promise 中有 throw 的话，相当于执行 reject，使用 try catch 捕获
    try {
      // executor 是一个执行器，进入会立即执行
      // 并传入resolve和reject方法
      executor(this.resolve, this.reject)
    } catch (error) {
      this.reject(error)
    }
  }
  // 初始化值
  PromiseResult = null // 终值
  PromiseState = 'pending' // 储存状态的变量，初始值是 'pending'，状态

  // resolve和reject为什么要用箭头函数？
  // 如果直接调用的话，普通函数this指向的是window或者undefined
  // 使用箭头函数让 this 指向当前实例对象
  resolve = (value) => {
    // 只有状态是等待，才执行状态修改（因为状态只能被修改一次）
    if (this.PromiseState !== 'pending') return
    this.PromiseState = 'fulfilled' // 状态修改为成功
    this.PromiseResult = value // 保存成功之后的值
  }

  reject = (reason) => {
    if (this.PromiseState !== 'pending') return
    this.PromiseState = 'rejected' // 状态修改为失败
    this.PromiseResult = reason // 保存失败之后的值
  }

  // 接收2个回调，onFulfilled，onRejected
  then(onFulfilled, onRejected) {
    // 校验参数，确保为函数
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : val => val
    onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }

    // 判断状态
    if (this.PromiseState === 'fulfilled') {
      // 调用成功回调，并且把值返回
      onFulfilled(this.PromiseResult)
    } else if (this.PromiseState === 'rejected') {
      // 调用失败回调，并且把原因返回
      onRejected(this.PromiseResult)
    }
  }
}

const test = new MyPromise((resolve, reject) => {
  resolve('成功')
})
console.log(test)
// 还要考虑 then方法链式调用，即then执行后返回一个Promise对象，保证then完还能继续执行then。还有then方法是微任务的情况，（用数组、定时器）